import axios from 'axios'
import store from '@/store'
import router from '@/router/index'
import { message } from 'ant-design-vue'


const request = axios.create({})
//配置公用路径


request.defaults.baseURL =
  process.env.NODE_ENV === 'production'  ? window.$baseUrl : '/apis'

//响应时间
request.defaults.timeout = 30000;

function redirectLogin() {
  router.replace('/login')
  // router.push({
  //   name: 'login',
  //   query: {
  //     redirect: router.currentRoute.fullPath
  //   }
  // })
}

function refreshToken() {
  return axios.create()({
    method: 'GET',
    url: `${request.defaults.baseURL}dot-workbench/workbench/token/refresh`,
    params: { refreshToken: store.state.user.refreshToken }
  })
}

// 请求拦截器
request.interceptors.request.use(
  function(config) {
    // 我们就在这里通过改写 config 配置信息来实现业务功能的统一处理
    // 获取组织机构，获取租户
    if (config.url == '/user/userLogin' || config.url.indexOf('dot') > -1){
      let user = JSON.parse(localStorage.getItem('user'));
      if( config.url.indexOf('dot') > -1){
        config.headers['token'] = user.axToken;
      }
      
    }else {
      // let each request carry token
      // ['X-Token'] is a custom headers key
      // please modify it according to the actual situation
      config.headers['access-token'] = store.state.user.token;
      config.headers["deviceId"] = localStorage.getItem("deviceId");
      // config.headers["x-app-type"] = 3;
    }


    // 在ie浏览器下对get的请求添加时间戳防止缓存
    if (
      /get/i.test(config.method) &&
      (window.ActiveXObject || 'ActiveXObject' in window)
    ) {
      config.params = config.params || {}
      config.params.data = +new Date()
    }
    return config
  },
  function(error) {
    // Do something with request error
    return Promise.reject(error)
  }
)

// 响应拦截器
let isRfreshing = false // 控制刷新 token 的状态
let requests = [] // 存储刷新 token 期间过来的 401 请求
request.interceptors.response.use(
  function(response) {
    // 状态码为 2xx 都会进入这里
    // console.log('请求响应成功了 => ', response)
    // 如果是自定义错误状态码，错误处理就写到这里
    const { code, msg } = response.data
    const status = parseInt(code)
    if (status === 400) {
      return Promise.reject(msg || '请求参数错误')
    } else if (status === 401) {
      // token 无效（没有提供 token、token 是无效的、token 过期了）
      // 如果有 refreshToken 则尝试使用 refreshToken 获取新的 token
      if (!store.state.user) {
        console.log('token失效，重刷：',store.state.user)
        message.warning('登录已过期，请重新登录')
        redirectLogin()
        return Promise.reject(msg)
      }
      // 刷新 token
      if (!isRfreshing) {
        isRfreshing = true // 开启刷新状态
        // 尝试刷新获取新的 token
        return refreshToken()
          .then(res => {
            if (parseInt(res.data.code) !== 200) {
              console.log('refreshToken res',res)
              throw new Error(res.data.mes || '刷新 Token 失败')
            }
            // 刷新 token 成功了
            let tempUser = store.state.user;
            tempUser.token = res.data.data;
            console.log('res.data.data:',res.data.data);
            store.commit('setUser', tempUser)
            // store.commit('setToken', res.data.data)
            // 把 requests 队列中的请求重新发出去
            requests.forEach(cb => cb())
            // 重置 requests 数组
            requests = []
            return request(response.config)
          })
          .catch(err => {
            console.log('err',err);
            message.warning('登录已过期，请重新登录')
            store.commit('setUser', null)
            redirectLogin()
            return Promise.reject(err)
          })
          .finally(() => {
            isRfreshing = false // 重置刷新状态
          })
      }
      // 刷新状态下，把请求挂起放到 requests 数组中
      return new Promise(resolve => {
        requests.push(() => {
          resolve(request(response.config))
        })
      })
    } else if (status === 403) {
      return Promise.reject('没有权限，请联系管理员')
    } else if (status === 404) {
      return Promise.reject('请求资源不存在')
    } else if (status === 405) {
      return Promise.reject('请求方式不支持')
    } else if (status >= 500 && status < 1000) {
      return Promise.reject('服务端错误，请联系管理员')
    }
    return response
  },
  async function(error) {
    if (error.request) {
      const { status } = error.request
      if (status === 404) return Promise.reject('请求资源不存在')
      else if (status === 400) return Promise.reject('请求参数错误')
      // 请求发出去没有收到响应
      message.destroy()
      message.error('请求超时，请刷新重试')
    } else {
      // 在设置请求时发生了一些事情，触发了一个错误
      message.error(`请求失败：${error.message}`)
    }
    // 把请求失败的错误对象继续抛出，扔给上一个调用者
    return Promise.reject('服务端错误，请联系管理员')
  }
)

export default request
